/*
 *  EventLib
 *  qScriptHandler.h
 *
 *	Copyright (c) 2011, AVS
 *	All rights reserved.
 *
 *	Redistribution and use in source and binary forms, with or without
 *	modification, are permitted provided that the following conditions are met:
 *	1.	Redistributions of source code must retain the above copyright
 *		notice, this list of conditions and the following disclaimer.
 *	2.	Redistributions in binary form must reproduce the above copyright
 *		notice, this list of conditions and the following disclaimer in the
 *		documentation and/or other materials provided with the distribution.
 *	3.	All advertising materials mentioning features or use of this software
 *		must display the following acknowledgement:
 *		This product includes software developed by the AVS.
 *	4.	Neither the name of the AVS nor the
 *		names of its contributors may be used to endorse or promote products
 *		derived from this software without specific prior written permission.
 *
 *	THIS SOFTWARE IS PROVIDED BY AVS ''AS IS'' AND ANY
 *	EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 *	WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 *	DISCLAIMED. IN NO EVENT SHALL AVS BE LIABLE FOR ANY
 *	DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 *	(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 *	LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
 *	ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 *	(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 *	SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

#ifndef _qScriptEventHandler_h
#define _qScriptEventHandler_h

#include "EventLib.h"

template<typename T>

class qScriptEventHandler : public qEventHandler
{

public:
	qScriptEventHandler();
	qScriptEventHandler(qScriptExec *_exec);
	~qScriptEventHandler();
	
	void set_exec(qScriptExec *_exec)
	{
		this->exec = _exec;
	}
	
	virtual void ON_EVENT(qEvent *evt);
	virtual EVENT_HANDLER_TYPE GET_TYPE();
	
private:
	qScriptExec *exec;
};

template<typename T>
qScriptEventHandler<T>::qScriptEventHandler()
		:	exec(NULL)
{}

template<typename T>
qScriptEventHandler<T>::qScriptEventHandler(qScriptExec *_exec)
		:	exec(_exec)
{}

template<typename T>
qScriptEventHandler<T>::~qScriptEventHandler()
{}

template<typename T>
void qScriptEventHandler<T>::ON_EVENT(qEvent *evt)
{
	if(this->exec)
	{
		this->exec->ctx->SetArgObject(0, evt);
		//		this->exec->ctx->SetArgObject(1, (T*)this->getRoot());
		this->exec->ctx->SetArgObject(1, (T*)this->getRoot());
		//this->exec->push_arg_complex<qEvent*>(evt, AS_OBJECT);
		//this->exec->push_arg_complex<qEvent*>(evt, AS_OBJECT);
		//this->exec->push_arg_complex<qComponent*>(this->getRoot(), AS_OBJECT);
		//this->exec->ctx->SetArgObject(1, (qEntity*)this->getRoot());
		this->exec->exec();
		this->exec->reset();
	}
	else
	{
		printf("cScriptExec* is null.");
	}
}

template<typename T>
EVENT_HANDLER_TYPE qScriptEventHandler<T>::GET_TYPE()
{
	return SCRIPT_HANDLER;
}

#endif